package com.heima.leetcode.practice;

import java.util.LinkedList;

/**
 * @author 勾新杰
 * @version 1.0
 * @description: leetcode 394. 字符串解码
 * @date 2025/2/27 10:34
 */
public class E394 {

    /**
     * 使用栈
     * @param s 待解码的字符串
     * @return 解码后的字符串
     */
    @SuppressWarnings("all")
    public String decodeString(String s) {
        char[] charArray = s.toCharArray();
        // 记录当前处理的子串，就是不会被[和]分割的字符串
        StringBuilder currString = new StringBuilder();
        // 记录处理过的子串到栈中，后续好拿出来拼接到currstring中
        LinkedList<String> stringStack = new LinkedList<>();
        // 记录当前处理的数字，一对[]对应一个数字，但可能是紧贴的多位合成一个数字
        LinkedList<Integer> numStack = new LinkedList<>();
        // 用来记录真正的数字（考虑多位）
        int num = 0;
        for (char c : charArray) {
            // 如果是数字，计算完整的数字（可能有多位）
            if(Character.isDigit(c)){
                num = num * 10 + c - '0';
            } else if (c == '[') {
                // 遇到 '['，将当前字符串和数字压入栈
                stringStack.push(currString.toString());
                numStack.push(num);
                // 重置当前字符串和数字
                currString = new StringBuilder();
                num = 0;
            } else if (c == ']') {
                // 遇到 ']'，从栈中弹出数字和字符串
                Integer repeatCount = numStack.pop();
                StringBuilder temp = new StringBuilder();
                temp.append(stringStack.pop());
                // 根据数字重复当前字符串拼接到temp中
                for (int i = 0; i < repeatCount; i++) {
                    temp.append(currString);
                }
                // 将拼接后的字符串赋值给当前字符串
                currString = temp;
            } else {
                // 如果是字母，直接拼接到当前字符串
                currString.append(c);
            }
        }
        return currString.toString();
    }
}
